/*
连接mongoDB数据库，做CRUD操作：
 * 增：C（Create）
 * 删：D（Delete）
 * 改：U（Update）
 * 查：R（Retrieve）
*/

//1.连接数据库
const { MongoClient } = require("mongodb");
let dbname = "h52005";

//连接mongoDB
function connect() {
  return new Promise((resolve, reject) => {
    MongoClient.connect("mongodb://localhost:27017", async (err, client) => {
      if (err) reject(err); //throw自带return
      // 连接数据库，无则自动创建
      let db = client.db(dbname);
      //找到数据库h51911中的集合song
      resolve({ client, db });
    });
  });
}

//查找数据
async function find(option) {
  //默认参数
  let defaultOpt = {
    query: {}, //默认不限制查询条件
    page: 1, //默认第一页
    pageSize: 10, //默认 10
    sort: {}, //默认不排序
  };

  //替补方案
  Object.assign(defaultOpt, option);

  let { client, db } = await connect();
  let col = db.collection(defaultOpt.colname);
  let index = (defaultOpt.page - 1) * defaultOpt.pageSize;
  let arr = await col
    .find(defaultOpt.query)
    .limit(defaultOpt.pageSize)
    .skip(index)
    .sort(defaultOpt.sort)
    .toArray();

  client.close();
  return arr;
}

// find({ colname: "user", query: { sex: "女", name: "胡娜" } }).then((res) => {
//   console.log(res, 333);
// });

async function findtotal(option) {
  //默认参数
  let defaultOpt = {
    query: {}, //默认不限制查询条件
  };

  //替补方案
  Object.assign(defaultOpt, option);

  let { client, db } = await connect();
  let col = db.collection(defaultOpt.colname);

  let arr = await col.find(defaultOpt.query).toArray();

  client.close();
  return arr;
}

// let p = find({
//   //配置参数：主角 优先级最高
//   colname: "song", //必填
//   sort: { id: -1 },
// });

// p.then((res) => {
//   console.log(res);
// });
// console.log(p);

//新增数据
async function insert(option) {
  let { client, db } = await connect();
  let col = db.collection(option.colname);
  let result = await col.insertMany(option.data); //数组格式
  //   console.log(result, 678);
  let data = {};
  if (result.insertedCount) {
    //插入成功
    data = {
      code: 2000,
      flag: true,
      message: "插入成功",
    };
  } else {
    //插入失败
    data = {
      code: 3000,
      flag: false,
      message: "插入失败",
    };
  }

  client.close(); //关闭数据库
  return data;
}

// let datalist = [
//   {
//     id: "5",
//     name: "苹果",
//   },
//   {
//     id: "6",
//     name: "小米",
//   },
// ];

//测试接口
// insert({
//   colname: "good",
//   data: datalist,
// }).then((res) => {
//   console.log(res, 789);
// });

//删除数据
async function remove(option) {
  let { client, db } = await connect();
  let col = db.collection(option.colname);
  try {
    let result = await col.deleteMany(option.query);
    let data = {};
    if (result.deletedCount) {
      //删除成功
      data = {
        code: 2000,
        flag: true,
        message: "删除成功",
      };
    } else {
      //删除失败
      data = {
        code: 3000,
        flag: false,
        message: "删除失败",
      };
    }

    client.close(); //关闭数据库
    return data;
  } catch (err) {
    let data = {
      code: 5000,
      flag: false,
      message: "服务器异常",
    };
    return data;
  }
}

//测试接口
// remove({
//   colname: "song",
//   query: {
//     name: "老鼠爱大米",
//   },
// }).then((res) => {
//   console.log(res, 890);
// });

//修改数据
async function update(option) {
  let { client, db } = await connect();
  let col = db.collection(option.colname);
  try {
    let result = await col.updateMany(option.query, { $set: option.data });
    // console.log(result, 789);
    let data = {};
    if (result.modifiedCount) {
      //修改成功
      data = {
        code: 2000,
        flag: true,
        message: "修改成功",
      };
    } else {
      //修改失败
      data = {
        code: 3000,
        flag: false,
        message: "修改失败",
      };
    }

    client.close(); //关闭数据库
    return data;
  } catch (err) {
    let data = {
      code: 5000,
      flag: false,
      message: "服务器异常",
    };
    return data;
  }
}

//测试接口
// update({
//   colname: "song",
//   query: { id: 4 },
//   data: { name: "伤心太平洋" },
// }).then((res) => {
//   console.log(res);
// });

module.exports = {
  find,
  insert,
  remove,
  update,
  findtotal,
};

//需求：坤坤 篮球主角； 替补：亮亮 替补
// let obj1 = {
//   //   name: "坤坤",
//   age: 22,
// };

// let obj2 = {
//   name: "亮亮",
//   //   age: 25,
// };

// Object.assign(obj2, obj1);

// console.log(obj2);
